/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Messenj;

import Utils.MjUtils;
import java.awt.Color;
import java.awt.Component;
import java.awt.GridLayout;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import javax.swing.Icon;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.ListCellRenderer;
import javax.swing.border.LineBorder;
import net.sf.jml.DisplayPictureListener;
import net.sf.jml.MsnContact;
import net.sf.jml.MsnMessenger;
import net.sf.jml.MsnObject;
import net.sf.jml.MsnSwitchboard;
import net.sf.jml.MsnUserStatus;
import net.sf.jml.event.MsnAdapter;
import net.sf.jml.message.MsnControlMessage;
import net.sf.jml.message.MsnDatacastMessage;
import net.sf.jml.message.MsnInstantMessage;
import net.sf.jml.message.p2p.DisplayPictureRetrieveWorker;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

/**
 *
 * @author edoardo
 */
public class MessenjListener extends MsnAdapter {

    MessenjManager mjm;
    Log log;

    public MessenjListener(MessenjManager MjManager) {
        this.mjm = MjManager;
        log = LogFactory.getLog(this.getClass());
    }

    /*
     * viene chiamato quando il login viene completato con successo
     * */
    @Override
    public void loginCompleted(MsnMessenger arg0) {
        JOptionPane.showMessageDialog(null, "Login completato con successo!!", "Messenj - Info", JOptionPane.INFORMATION_MESSAGE);
        this.mjm.start();
        log.info("Login completato con successo");
    }

    /*
     * viene chiamato quando viene completato il download della lista di contatti
     * dell'utente
     */

    MsnContact[] mc;
    MsnMessenger mess;

    @Override
    public void contactListInitCompleted(MsnMessenger messenger) {
        this.mess = messenger;
        log.info("Lista contatti scaricata con successo");
        mc = messenger.getContactList().getContacts();
        final String[] s = new String[mc.length];
        for(int i = 0;i < s.length; i++)
        {
            s[i] = mc[i].getEmail().getEmailAddress();
        }
        this.mjm.messenj.jList1.setModel(new javax.swing.AbstractListModel() {

            String[] strings = s;

            public int getSize() {
                return strings.length;
            }

            public Object getElementAt(int i) {
                return strings[i];
            }
        });
        this.mjm.messenj.jList1.setCellRenderer(new ListCellRenderer() {

            public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
                JPanel jp = new JPanel();
                jp.setLayout(new GridLayout(1,1));
                final JLabel jl = new JLabel(mc[index].getEmail().getEmailAddress());
                JLabel jim = new JLabel();
                mess.retrieveDisplayPicture(mc[index].getAvatar(), new DisplayPictureListener() {

                    public void notifyMsnObjectRetrieval(MsnMessenger messenger, DisplayPictureRetrieveWorker worker, MsnObject msnObject, ResultStatus result, byte[] resultBytes, Object context) {
                        ByteArrayInputStream bis = new ByteArrayInputStream (resultBytes);
                        BufferedImage bi;
                        try {
                            bi = ImageIO.read(bis);
                        } catch (IOException ex) {
                            Logger.getLogger(MessenjListener.class.getName()).log(Level.SEVERE, null, ex);
                        }
                        //jl.setIcon(Icon(new Image(bi)));

                    }
                });
                jp.setBackground( MjUtils.getColor(mc[index].getStatus()));
                jp.add(jl);
                return jp;
            }
        });
    }

    /*
     * chiamato quando l'uetente riceve un messaggio
     * */
    @Override
    public void instantMessageReceived(MsnSwitchboard switchboard, MsnInstantMessage message, MsnContact contact) {
        log.info("Messaggio ricevuto da: " + contact.getEmail().getEmailAddress());
        log.info("Contenuto: " + message.getContent());
    }

    /*
     * metodo chiamato quando viene richiesta una nuova conversazione
     * */
    @Override
    public void switchboardStarted(MsnSwitchboard switchboard) {
        log.info("E' stata creata una nuova conversazione");
        MjChatFrame mjcf = new MjChatFrame();
        mjcf.setVisible(true);
        this.mjm.finestreChat.put(switchboard, mjcf);
        log.info("Finestra aggiunta all'hashtable");
    }

    /*
     * metodo chiamato quando viene chiusa una conversazione
     * */
    @Override
    public void switchboardClosed(MsnSwitchboard switchboard) {
        log.info("E' stata chiusa una conversazione");
        this.mjm.finestreChat.remove(switchboard);
        log.info("Finestra rimossa dall'hashtable");
    }

    /*
     * metodo chiamato quando un contatto entra in una conversazione
     * */
    @Override
    public void contactJoinSwitchboard(MsnSwitchboard switchboard, MsnContact contact) {
        log.info(contact.getEmail().getEmailAddress() + " è entrato a far parte di una conversazione");
    }

    /*
     * metodo chiamato quando un contatto lascia una conversazione
     * */
    @Override
    public void contactLeaveSwitchboard(MsnSwitchboard switchboard, MsnContact contact) {
        log.info(contact.getEmail().getEmailAddress() + " ha lasciato la conversazione");
    }

    /*
     * metodo chiamato quando un contatto cambia stato
     * */
    @Override
    public void contactStatusChanged(MsnMessenger messenger, MsnContact contact) {
        log.info(contact.getEmail().getEmailAddress() + " è passato da " +
                MjUtils.getDisplayableStatus(contact.getOldStatus()) + " a " +
                MjUtils.getDisplayableStatus(contact.getStatus()));
    }

    @Override
    public void controlMessageReceived(MsnSwitchboard switchboard, MsnControlMessage message, MsnContact contact) {
        log.info("Ricevuto messaggio di controllo, " + contact.getEmail().getEmailAddress() + " sta scrivendo");
    }

    @Override
    public void datacastMessageReceived(MsnSwitchboard switchboard, MsnDatacastMessage message, MsnContact contact) {
        log.info("Ricevuto messaggio datacast con id: " + message.getId() + " da " + contact.getEmail().getEmailAddress());
    }

    @Override
    public void contactAddedMe(MsnMessenger messenger, MsnContact contact) {
        log.info("Sei stato aggiunto da " + contact.getEmail().getEmailAddress());
    }

    @Override
    public void contactAddCompleted(MsnMessenger messenger, MsnContact contact) {
        log.info(contact.getEmail().getEmailAddress() + " è stato aggiunto con successo");
    }
}
